/*
需求：
    封装一个方法，
    输入为文件路径，
    输出为文件内容。
 */

const fs=require('fs');
const path=require('path');

// 普通读文件的方式
/*
fs.readFile(path.join(__dirname,'./files/1.txt'),'utf-8',(err,dataStr)=>{
    if (err) throw err;
    console.log(dataStr);
});
*/

/**
 * 封装读文件的函数 一
 * 我们可以规定一下，callback中有两个参数，
 * 第一个参数是失败的结果，
 * 第二个参数是成功的结果。
 *
  */
/*
function getFileByPath(fpath,callback) {
    fs.readFile(fpath,'utf-8',(err,dataStr)=>{
        if (err) return callback(err);
        // console.log(dataStr);
        callback(null,dataStr);
    });
}

getFileByPath(path.join(__dirname,'./files/10.txt'),(err,dataStr)=>{
    if(err) return console.log(err.message);
    console.log(dataStr);
});
*/


/*
封装函数的参数 二
 */

function getFileByPath(fpath,successCallback,errCallback) {
    fs.readFile(fpath,'utf-8',(err,dataStr)=>{
        if (err) return errCallback(err);
        // console.log(dataStr);
        successCallback(dataStr);
    });
}

// 读取文件的函数是异步的，通过下面的方式我们是不能够按照顺序读取三个文件的。
/*
getFileByPath(path.join(__dirname,'./files/1.txt'),data=>{
    console.log(data);
},err=>{
    console.log(err);
});

getFileByPath(path.join(__dirname,'./files/2.txt'),data=>{
    console.log(data);
},err=>{
    console.log(err);
});

getFileByPath(path.join(__dirname,'./files/3.txt'),data=>{
    console.log(data);
},err=>{
    console.log(err);
});
*/

// 如果我们想要同步读取文件，可以通过以下的方式，但是这种多重嵌套的形式非常不好。
// 如果嵌套的层数过多，我们就称这种回调为回调地狱。
/*
function successCB(data){
    console.log(data);
}
function errCB(err){
    console.log(err);
}
getFileByPath(path.join(__dirname,'./files/1.txt'),data=>{
    console.log(data);
    getFileByPath(path.join(__dirname,'./files/2.txt'),data=>{
        console.log(data);
        getFileByPath(path.join(__dirname,'./files/3.txt'),data=>{
            console.log(data);
        },errCB)
    },errCB)
},errCB);
*/

//使用 ES6 的 Promise 来解决 回调地狱 问题。